package com.sourcetrip.my;


import com.sourcetrip.my.inter.List;
import com.sourcetrip.my.inter.Set;
import com.sourcetrip.utils.Visitor;

/**
 * @author: ZhouBert
 * @date: 2020/12/22
 * @description: 通过 linkedList 实现的集合（允许加入 null ）
 * 分析：
 * 由于集合需要去重，所以在 add() 中需要进行处理！
 * --
 * 对比：
 * 比较 TreeSet 而言，效率不及 TreeSet ，但是 是按照添加元素的顺序进行遍历的。
 * 但是 TreeSet 不会根据添加顺序，而且其实 Set 本来就没有要求固定的遍历方式。
 */
public class ListSetByLinkedList<E> implements Set<E> {

	/**
	 * 通过组合的方式，实现 集合
	 */
	private List<E> list = new LinkedListV0<>();

	@Override
	public int size() {
		return list.size();
	}

	@Override
	public boolean isEmpty() {
		return list.isEmpty();
	}

	@Override
	public void clear() {
		list.clear();
	}

	@Override
	public boolean contains(E element) {
		return list.contains(element);
	}

	/**
	 * 如果找到了元素，进行替换（equals 并不代表对象完全相同）
	 *
	 * @param element
	 */
	@Override
	public void add(E element) {
//		if (!list.contains(element)){
//			list.add(element);
//		}
		int index = list.indexOf(element);
		//1.元素存在时，进行替换
		if (index != List.ELEMENT_NOT_FOUND) {
			list.set(index, element);
		} else {
			//2.元素不存在，直接添加
			list.add(element);
		}
	}

	@Override
	public void remove(E element) {
		int index = list.indexOf(element);
		if (index != List.ELEMENT_NOT_FOUND) {
			list.remove(index);
		}

	}

	/**
	 * 当 visitor 为空，不进行遍历
	 *
	 * @param visitor
	 */
	@Override
	public void traversal(Visitor<E> visitor) {
		if (visitor == null) {
			return;
		}
		int size = list.size();
		for (int i = 0; i < size; i++) {
			if (visitor.stop) {
				return;
			} else {
				visitor.visit(list.get(i));
			}
		}
	}
}
